#[test]
pub fn run() {
    let a = vec![1,2,3];
    // 当变量离开作用域的时候，会被释放或者drop掉。
    // 也就是a被move到了b，a就不能再被使用了。这样是为了避免内存泄漏。
    let b = a;  
    // println!("{:?}", a);    // error[E0382]: borrow of moved value: `a`
    println!("{:?}", b);   

    // 如果想要不被move，可以使用实现了Copy和Clone的类型（Rust中为很多简单类型都自动实现了Copy这个trait。）
    let c = 1;
    let d = c;
    println!("{:?}", c);
    println!("{:?}", d);

    let pl = PointList{
        points: vec![Point{x: 1, y: 2}, Point{x: 3, y: 4}]
    };
    pl.points.iter().for_each(|p| println!("Point:{:?}, {:?}", p.x, p.y));

}
//  Copy和Clone的区别，就类似于浅拷贝和深拷贝的区别，上面Point的定义，两个变量都是分配在栈上的，浅拷贝和深拷贝没有区别，
// 因此Point可以同时实现Copy和Clone这两个trait；而下面PointList的定义中，Vec在栈上只记录了元信息(pointer, capacity, length)，
// Vec的元素是存放在堆上的，只能深拷贝，因此只实现了Clone这个trait。
// Point的定义中，由于i32同时实现了Copy和Clone这两个trait，所以Point也实现了Copy和Clone这两个trait。
#[derive(Copy, Clone)]
struct Point {
   x: i32,
   y: i32,
}

// PointList的定义中，由于Vec<Point>实现了Clone这个trait，所以PointList也实现了Clone这个trait。
#[derive(Clone)]
struct PointList {
    points: Vec<Point>,
}